#include <bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int st[N];//若i是质数则st[i]=false,否则st[i]=true;
int prmie[N];
int cnt=0;
//void get_primies(int n)
//{
//  for(int i=2;i<=n;i++){
//        if(!st[i]){
//            prmie[cnt++]=i;
//            for(int j=i;j<=n;j+=i) st[j]=true;//可以用质数就把所有的合数都筛掉；
//        }
//    }
//}

void get_primies(int n)
{
   //外层从2~n迭代，因为这毕竟算的是1~n中质数的个数，而不是某个数是不是质数的判定
    for(int i=2;i<=n;i++){
        if(!st[i]) prmie[cnt++]=i;
        for(int j=0;prmie[j]<=n/i;j++){//primes[j]<=n/i:变形一下得到——primes[j]*i<=n,把大于n的合数都筛了就
        //没啥意义了
            st[prmie[j]*i]=true;//用最小质因子去筛合数

            //1)当i%primes[j]!=0时,说明此时遍历到的primes[j]不是i的质因子，那么只可能是此时的primes[j]<i的
            //最小质因子,所以primes[j]*i的最小质因子就是primes[j];
            //2)当有i%primes[j]==0时,说明i的最小质因子是primes[j],因此primes[j]*i的最小质因子也就应该是
            //prime[j]，之后接着用st[primes[j+1]*i]=true去筛合数时，就不是用最小质因子去更新了,因为i有最小
            //质因子primes[j]<primes[j+1],此时的primes[j+1]不是primes[j+1]*i的最小质因子，此时就应该
            //退出循环，避免之后重复进行筛选。
            if(i%prmie[j]==0) break;
        }
    }
}
int main()
{
    int t;
    cin>>t;
     get_primies(N-1);
    while(t--)
    {
        int n,k;
        cin>>n>>k;
        int res=0;
        for(int i=2;i<=n;i++)
        {
            if(!st[i])//若是质数
            {
                for(int j=1;j<cnt;j++)
                {
                    if(prmie[j]+prmie[j-1]+1==i)
                    {
                        res++;
                        break;
                    }
                }
            }
        }
        if(res>=k)cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }

    for(int i=0;i<cnt;i++)cout<<prmie[i]<<' ';
    return 0;
}